package com.jdk.demo.io.so_lingerDemo.demo1;

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(8088);
		Socket socket = serverSocket.accept();
		System.out.println("A socket getSoLinger=" + socket.getSoLinger());
		socket.setSoLinger(true, 0);
		System.out.println("B socket getSoLinger=" + socket.getSoLinger());

		OutputStream out = socket.getOutputStream();
		for (int i = 0; i < 10; i++) {
			out.write(("12345678901234567890123456789012345678901234567890"
					 + "12345678901234567890123456789012345678901234567890").getBytes());
		}
		out.write("end!".getBytes());
		System.out.println("socket close before=" + System.currentTimeMillis());
		out.close();
		socket.close();
		System.out.println("socket close after=" + System.currentTimeMillis());
		serverSocket.close();
		// 输出的before和end几乎一样，说明close没有阻塞
		// 从抓包过程中可以分析出，服务端向客户端发送了8个字节，因为客户端最后的ack是9,。但是在客户端的控制台中输出的数据却是1-3，说明4-8在操作系统的内核空间中。
		// 而服务端发送缓冲区数据的个数为1000-8=992。当服务端执行close方法时，立即将rst标记传给客户端重置连接，客户端再次执行read方法时出现异常：
		// Exception in thread "main" java.net.SocketException: Connection reset
		// 并且服务端发送缓冲区中的数据被丢弃了
	}

}
